//
//package com.macro.cloud.controller;
//
//
//import java.util.Queue;
//import java.util.concurrent.LinkedBlockingQueue;
//
///**
// * 同步FIFO队列,这里的修改方法都加锁
// *
// * @param <E>
// */
//public class SynchronizedFifoQueue<E>   {
//
//    /**
//     * Serialization version
//     */
//    private static final long serialVersionUID = 2412805092710877986L;
//    /**
//     * The Queue to decorate
//     */
//    private final Queue<E> queue=new LinkedBlockingQueue<>();
//    /**
//     * Capacity of the queue.
//     */
//    private final int maxElements;
//    /**
//     * The object to lock on
//     */
//    protected final Object lock;
//
//
//    public static <T> SynchronizedFifoQueue<T> synchronizedQueue(final Queue<T> queue) {
//        return new SynchronizedFifoQueue<>(queue, 16);
//    }
//
//    //-----------------------------------------------------------------------
//
//    /**
//     * Constructor that wraps (not copies).
//     *
//     * @param queue       the queue to decorate, must not be null
//     * @param maxElements
//     * @throws NullPointerException if the queue is null
//     */
//    protected SynchronizedFifoQueue(final Queue<E> queue, int maxElements) {
//        if (queue == null) {
//            throw new NullPointerException("queue must not be null.");
//        }
//        this.maxElements = maxElements;
//        this.queue = queue;
//        this.lock = this;
//    }
//
//    /**
//     * Constructor that wraps (not copies).
//     *
//     * @param queue       the queue to decorate, must not be null
//     * @param maxElements
//     * @param lock        the lock object to use, must not be null
//     * @throws NullPointerException if the queue or lock is null
//     */
//    protected SynchronizedFifoQueue(final Queue<E> queue, int maxElements, final Object lock) {
//        if (queue == null) {
//            throw new NullPointerException("Queue must not be null.");
//        }
//        if (lock == null) {
//            throw new NullPointerException("Lock must not be null.");
//        }
//        this.queue = queue;
//        this.maxElements = maxElements;
//        this.lock = lock;
//    }
//
//    /**
//     * Gets the queue being decorated.
//     *
//     * @return the decorated queue
//     */
//    protected Queue<E> decorated() {
//        return queue;
//    }
//
//
//    @Override
//    public boolean offer(final E e) {
//        synchronized (lock) {
//            //如果超出长度,入队时,先出队
//            if (decorated().size() >= maxElements) {
//                remove();
//            }
//            return decorated().offer(e);
//        }
//    }
//
//    @Override
//    public E peek() {
//        synchronized (lock) {
//            return decorated().peek();
//        }
//    }
//
//    @Override
//    public E poll() {
//        synchronized (lock) {
//            return decorated().poll();
//        }
//    }
//
//    @Override
//    public E remove() {
//        synchronized (lock) {
//            return decorated().remove();
//        }
//    }
//
//}
